package com.itany.corejava.code08_常用类.string;

/**
 * @author 石小俊
 * @version 1.0
 * @date 2023年03月16日 13:42
 */
public class Test11_常量池 {
    public static void main(String[] args) {
        // 使用构造方法创建
        // 在堆中分配了一个空间,其值为admin
        // 只要是new出来的,一定是在堆中分配空间
        String s1 = new String("admin");
        // 当为s1重新赋值时,在堆中再次分配一个空间
        // 由于admin的空间不再被任何对象所引用,因此会被gc回收
         s1 = new String("jack");
        // 此时定义一个s3,会在堆中再次分配一个空间
        String s3 = new String("admin");

        // 使用双引号直接创建字符串
        // 在常量池中分配了一个空间,其值为admin
        String s2 = "admin";
        // 当为s2重新赋值时,在常量池中再次分配一个空间
        // 常量池中的空间不会被回收,因此之前的admin的控件一直存在
        s2 = "jack";
        // 此时由于常量池中已经存在admin的空间
        // 因此,直接指向之前的admin,并没有重新分配空间
        String s4 = "admin";

        String s5 = new String("jack");
        System.out.println(s1 == s5); // false
        String s6 = "jack";
        System.out.println(s2 == s6); // true

        String s7 = "a";
        String s8 = "aa";
        String s9 = "aaa";
        // s10不是字符常量,其值是在运行时确定的,而不是直接通过双引号给的
        // 当运行前不确定的值是不会存放到常量池中
        // 因此,此时的s10存放在堆中
        String s10 = s7 + s8;
        String s11 = "a"+"aa";
        String s12 = "a" + s8;
        System.out.println(s9 == s10); // false
        System.out.println(s9 == s11); // true
        System.out.println(s9 == s12); // false

        // 当前方法中共有11个对象
        // 堆中有6个,常量池中有5个

    }
}
